/-docs
/-editor
/-files
/-files-old
/-imports
/-layout
/-storage
/-tests
/-typings
TypeScriptService.ts
functions.ts
ko.ts
persistence.api.ts
persistence.ts
shell.ts
teapo.html
teapo.js
teapo.ts
x
 
147
        }
148
      }
149
    }
150
151
152
    
153
    private _initFromOpenDatabase(openDatabase, forceLoadFromDom: boolean, pathElements: { [name: string]: HTMLScriptElement; }) {
154
      var dbName = this.handler.uniqueKey ? this.handler.uniqueKey : getUniqueKey();
155
156
      var detectIndexedDB = new teapo.storage.attached.indexedDB.DetectStorage();
157
      detectIndexedDB.detectStorageAsync(dbName, (errorIndexedDB, load) => {
158
        if (errorIndexedDB) {
159
          var detectWebSQL = new teapo.storage.attached.webSQL.DetectStorage();
160
          detectWebSQL.detectStorageAsync(dbName, (errorWebSQL, load) => {
161
            if (errorWebSQL) {
162
              alert(
163
                'Persistent storage is not stable\n'+
164
                'indexedDB ' + errorIndexedDB + '\n' +
165
                'webSQL ' + errorWebSQL);
166
              return;
167
            }
168
169
            this._initWithStorage(load, forceLoadFromDom, pathElements);
170
          });
171
          return;
172
        }
173
        
174
        this._initWithStorage(load, forceLoadFromDom, pathElements);
175
      });
176
177
      var db = openDatabase(dbName, 1, null, 1024 * 1024 * 5);
178
179
      this._executeSql = (
180
        sqlStatement: string,
181
        args: any[],
182
        callback: (transaction: SQLTransaction, result: SQLResultSet) => void,
183
        errorCallback: (transaction: SQLTransaction, error: SQLError) => void) => {
184
185
        var errorCallbackSafe = (t: SQLTransaction, e: SQLError) => {
186
          alert(e + ' ' + e.message + '\n' + sqlStatement + '\n' + args);
187
          errorCallback(t, e);
188
        };
189
190
        db.transaction((t) => t.executeSql(sqlStatement, args, callback, errorCallbackSafe));
191
      };
192
      this._insertMetadataSql = 'INSERT INTO "*metadata" (name, value) VALUES(?,?)';
193
      this._updateMetadataSql = 'UPDATE "*metadata" SET value=? WHERE name=?';
194
195
      this._metadataProperties = {};
196
      this._loadTableListFromWebsql((tableList) => {
197
        this._initWithTableList(tableList, forceLoadFromDom, pathElements);
198
      });
199
    }
200
201
    private _initWithStorage(load: teapo.storage.attached.LoadStorage, forceLoadFromDom: boolean, pathElements: { [name: string]: HTMLScriptElement; }) {
202
      var domEdited = this._metadataElement ?
203
        safeParseInt(this._metadataElement.getAttribute('edited')) :
204
        null;
205
206
      if (domEdited || 0 < load.editedUTC || 0) {
207
        console.log('DOM is younger, need to call load.load', domEdited, load.editedUTC);
208
      }
209
      else {
210
        console.log('DOM is older, need to call load.migrate', domEdited, load.editedUTC);
211
      }
212
    }
213
214
    private _initWithTableList(tableList: string[], forceLoadFromDom: boolean, pathElements: { [name: string]: HTMLScriptElement; }) { 
215
      var metadataTableExists = false;
216
      for (var i = 0; i < tableList.length; i++) {
217
        if (tableList[i] === '*metadata') {
218
          metadataTableExists = true;
219
          break;
220
        }
221
      }
222
      if (!metadataTableExists || forceLoadFromDom) {
223
        this._loadInitialStateFromDom(pathElements);
224
        return;
225
      }
226
227
      var domEdited = this._metadataElement ?
228
        safeParseInt(this._metadataElement.getAttribute('edited')) :
229
        null;
230
207:0